Con este .htaccess :
RewriteEngine On RewriteRule foo/(.*) /foo-$1 # here I tried [L], [PT], [C], etc. RewriteRule . index.php [L]Probé todas las banderas posibles para la primera RewriteRule, pero siempre, este código PHP:
<?php echo $_SERVER['REQUEST_URI']; ?> siempre repite /foo/bar en lugar de /foo-bar , al acceder a http://example.com/foo/bar . ¿Por qué?
¿Cómo hacer que RewriteEngine de Apache también modifique REQUEST_URI que verá PHP?
Nota: no quiero [R] porque una redirección generaría una nueva solicitud del navegador y cambiaría la URL que se muestra en la barra de URL, lo cual no quiero.
Consulte también RewriteRule cuando la cadena de sustitución no es una ruta de archivo sino una URL que debe ser procesada por las siguientes reglas .
Creo que lo que intentas hacer es imposible sin algún trabajo. He proporcionado 2 soluciones en esta publicación, una usando auto_prepend_file y otra usando mod_proxy.
Mire el script a continuación, esto no establece directamente el REQUEST_URI global, sino que lo sobrescribe en PHP, con el siguiente código:
php_value auto_prepend_file "before.php" RewriteEngine On RewriteRule foo/(.*) /foo-$1 RewriteRule . index.php [L]Asegúrate de agregar esta línea:
php_value auto_prepend_file "before.php"En este script, puede reemplazar REQUEST_URI:
Me gusta:
$_SERVER['REQUEST_URI'] = "/" . str_replace('/', '-', ltrim($_SERVER['REQUEST_URI'], "/"));Puede mejorar aún más este script, pero creo que el concepto es claro.
Index.php no se ve afectado pero contiene la regla reescrita:
var_dump($_SERVER['REQUEST_URI']); //string(7) "/foo-bar" Una solicitud a http://localhost/foo/bar?test es ahora: string(13) "/foo-bar?test"
Al usar [L], puede obtener la URL reescrita de la siguiente manera:
var_dump($_SERVER['REDIRECT_URL']); # /foo-barEntonces el .htaccess se convierte en:
php_value auto_prepend_file "before.php" RewriteEngine On RewriteRule foo/(.*) /foo-$1 [L] # please note [L] here RewriteRule . index.php [L]Por lo tanto, before.php puede ser reemplazado por:
$_SERVER['REQUEST_URI'] = $_SERVER['REDIRECT_URL'];Descubrí que también puedes usar mod proxy:
Tuve que habilitar los siguientes módulos:
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_balancer_module modules/mod_proxy_balancer.so LoadModule proxy_ftp_module modules/mod_proxy_ftp.so LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule proxy_ajp_module modules/mod_proxy_ajp.so LoadModule proxy_connect_module modules/mod_proxy_connect.soAhora su .htaccess se cambia a (observe la bandera [P]):
RewriteEngine On RewriteRule ^foo/(.+)$ /foo-$1 [L,P] RewriteRule . index.php Esto enviará todas las solicitudes de foo/bar a /foo-bar y cambiará $_SERVER['REQUEST_URI'] consecuencia.
var_dump($_SERVER['REQUEST_URI']); //output: string(8) "/foo-bar"Sin embargo, creo que usar el archivo de prefijo de PHP es una forma más eficiente.
$_SERVER['REQUEST_URI'] devuelve el original-uri Apache y no current-uri .
Con este archivo .htaccess :
CGIVar REQUEST_URI current-uri RewriteRule (.*) index.php [L] entonces una solicitud a example.com/hello/world dará:
$_SERVER["REQUEST_URI"] "/index.php" $_SERVER["REDIRECT_URL"] "/hello/world" Sin la línea CGIVar , daría "/hello/world" tanto para REQUEST_URI como para REDIRECT_URL .
Después de más investigaciones, parece que PHP siempre verá la URL original en $_SERVER['REQUEST_URI'] y no el objetivo de RewriteRule. (fuente autorizada necesaria aquí).
Por cierto, el destino de una RewriteRule suele ser un archivo que procesará la solicitud, excepto si usamos un indicador de redirección [R], entonces en este caso el navegador realizará una nueva solicitud a la nueva URL (y la URL del navegador cambios de barra).